Database Storage (2)

Potential problems with the slotted page design

Log-Structured Storage

使用日志记录的方式保存对 tuple 的修改(通常有两种修改方式 PUTDELETE),新的记录只需附加在日志文件末尾而无需查询先前的记录。


当一页写满时,DBMS 会将其写入硬盘并开始写入下一页,从而减少硬盘读写次数


要从一个给定的 tuple id 查询对应的数据,DBSM 会以从新到旧的顺序查询日志,这可能会耗费很长时间并且要对硬盘进行多次读取。

在内存中维护一个索引,这个索引能够将 tuple id 映射到对应最新的那条日志记录

Compaction

通过串联数个日志文件中的记录,移除其中不需要的记录,组成新的日志文件。

对于每个 tuple id 对应的日志记录,只需保存最新的一条,这可以减少日志占用的硬盘空间,实现 compaction。

在实现 compaction 后,可以将剩余的记录按照 tuple id 排序,以提升查询效率(Time order to Tuple Id order)。

实现例子:Sorted String Tables(SSTables) 在如下数据库中

Universal Compaction(rocksdb) Level Compaction(leveldb)

Downsides

Tuple Storage

INTEGER/BIGINT/SMALLINT/TINYINT

FLOAT/REAL vs. NUMERIC/DECIMAL

VARCHAR/VARBINARY/TEXT/BLOB(variable length)

TIME/DATE/TIMESTAMP

Large Values

通常,一个 tuple 的大小不能大于单个页的大小。

对于一些大于单页大小限制的数据,DBMS 会使用溢出(,Overflow,)存储页存储该数据,在原来的页本该存储该数据的位置会留下说明该溢出页存储位置的数据。

External Value Storage

当需要在数据库中存入大量文本,图片、视频、音频等多媒体文件,二进制文件如 PDF 文件、Excel 表格等时,可以使用外部值存储(,External Value Storage,)

System Catalogs

Stores meta-data about databases

Access Table Schema

-- Postgres
\d;
-- MySQL
SHOW TABLES;
-- SQLite
.tables

点此查看原文